#  -*- coding: utf-8 -*-

class Operation_tool(object):
    '''
        运算工具类
        主要是是涉及到的运算进行封装
    '''

    def __init__(self):
        pass

    def degree_of_unbalance(self, max_even, min_even):
        '''
        计算三相 不平衡度
        （同一时间点三相中最大电流- 同一时间点三相中最小电流）/ 同一时间点三相中最大电流    注意 光伏台区的存在 所以需要使用绝对值
        :param max_even:  同一时间点三相中最大电流
        :param min_even: 同一时间点三相中最小电流
        :return: 三相不平衡度的值
        '''
        if not max_even is None and max_even!='' and min_even!=''and not min_even is None:      # 数据不能不能为None 与空

            if abs(max_even) != 0:                                                              # 分母不为零
                degree_of_unbalance_value = (abs(max_even) - abs(min_even)) / abs(max_even)     # 计算三相不平衡
            elif abs(max_even)==0:                                                              # 分母为零处理方案
                degree_of_unbalance_value = ''
        else:
            degree_of_unbalance_value = ''                                                      # 为空处理方案
        return degree_of_unbalance_value

    def neutral_point_even(self,aeven,beven,ceven):
        '''
        中性点电流计算
        ((A相电流 -0.5B相电流-0.5C相电流）^2  + 0.75(B相电流-C相电流)^2)^0.5
        :param aeven: A 相电流
        :param beven: B 相电流
        :param ceven: C 相电流
        :return: 中性点电流计算结果
        '''

        if not aeven is None and aeven != '' and beven != '' and not beven is None and ceven != '' and not ceven is None:
            point_even = pow((abs(aeven)-0.5*(abs(beven)+abs(ceven))), 2) + 0.75*pow((abs(beven)-abs(ceven)), 2)
            point_even_value = pow(point_even, 0.5)
        else:
            point_even_value = ''
        return point_even_value

    def voltage_pass_rate(self,voltage_data_day_list):
        '''
        计算电压合格率  电压越上线7% 下限10%： 198<u<235.4
        :param voltage_data_day_list: 需要计算这一天电压数据列表
        :return: 返回这一天电压合格率
        '''

        vlotage_number = 0                                      # 这一天电压有效点数统计
        for lon in voltage_data_day_list:
            if not lon is None and lon != '':                   # 电压值不为零 与 null
                vlotage_number += 1                             # 有效点数统计
        pass_rate_number = 0                                    # 电压合格点数统计
        for low in voltage_data_day_list:
            if low > 198 and low < 235.4:                       # 合格电压诊断
                pass_rate_number += 1
        if voltage_data_day_list:                               # 列表不为空
            if vlotage_number != 0:                             # 有效点数不能为空
                voltagePassRate = pass_rate_number / vlotage_number # 电压合格率计算

        else:                                                   # 列表为空
            voltagePassRate=''
        return voltagePassRate

    def export_voltage_or_even(self,voltage_data_list):
        '''
        这一相的平均（电流）电压值  24 点有效数据求平均    各项有效数据求平均
        :param voltage_data_list: 这一项电压（电流）的数据
        :return: 这一项的平均值
        '''
        vlotage_number = 0                                      # 这一项电压（电流）有效点数统计
        for low in voltage_data_list:
            if not low is None and low != '':                   # 电压（电流）值不为零 与 null
                vlotage_number += 1                             # 有效点数统计

        sum_vlotage=0
        for lon in voltage_data_list:
            if not lon is None and lon != '':
                sum_vlotage+=lon
        if voltage_data_list:
            if vlotage_number!=0:
                export_voltage_value=sum_vlotage/vlotage_number # 这一相平均电压（电流）
        else:                                                   # 列表为空
            export_voltage_value=''
        return export_voltage_value                             # 这一项的平均（电流）电压值

    def voltage_drop(self,tg_voltage_data_list,user_voltage_data_list):
        '''
        压降 = 台区出口电压平均值-用户电压平均值  (根据电表编号与时间分组 获得每一天24点数据)  数据不为NULL与空判断
        :param tg_voltage_data_list: 台区出口电压平均值
        :param user_voltage_data_list: 用户电压平均值
        :return: 压降值  若台区或用户数据均异常返回 NOne
        '''

        nmber_phase_tg = 0                                                                      # 台区相数
        sum_tg_data = 0                                                                         # 台区 各项电压之和
        for phase_number, tg_data in enumerate(tg_voltage_data_list):
            if not tg_data is None and tg_data != '':                                           # 排斥为空为null数据
                sum_tg_data += tg_data                                                          # 求各项电压和
            nmber_phase_tg = nmber_phase_tg - nmber_phase_tg + phase_number + 1                 # 获得台区为几项电

        nmber_phase_user = 0                                                                    # 用户相位数
        sum_user_data = 0                                                                       # 用户各相电压
        for phase_number, user_data in enumerate(user_voltage_data_list):
            if not user_data is None and user_data != '':
                sum_user_data += user_data
            nmber_phase_user = nmber_phase_user - nmber_phase_user + phase_number + 1

        if  nmber_phase_tg!=0:                                                                  # 台区相位数不能为0
            if nmber_phase_user!=0:                                                             # 用户相位数不能为0
                voltage_drop_value = sum_tg_data / nmber_phase_tg - sum_user_data/nmber_phase_user# 压降 = 台区各相电压和的平均值-台区各相电压和的平均值

        return voltage_drop_value

